﻿package {
	import air.update.descriptors.ApplicationDescriptor;
	import br.com.network.ControleServerSocket;
	import br.com.network.DataVO;
	import br.com.network.events.ControleServerSocketEvent;
	import br.com.network.TiposBroadcast;
	import br.com.poliwar.model.Mensagens;
	import br.com.poliwar.model.vo.LoginVO;
	import br.com.poliwar.model.vo.UsuarioVO;
	import br.com.poliwar.Sala;
	import flash.data.SQLConnection;
	import flash.data.SQLMode;
	import flash.data.SQLStatement;
	import flash.display.Sprite;
	import flash.events.Event;
	import flash.events.MouseEvent;
	import flash.events.ProgressEvent;
	import flash.events.SQLErrorEvent;
	import flash.events.SQLEvent;
	import flash.filesystem.File;
	import flash.net.ObjectEncoding;
	import flash.net.Responder;
	import flash.net.Socket;
	import flash.text.TextField;
	import flash.utils.Endian;
	import flash.utils.getDefinitionByName;
	import gs.TweenMax;
	
	/**
	 * ...
	 * @author Ricardo Teixeira
	 */
	public class Main extends Sprite {
		
		private var qtdSalas:int;
		private var salas:Vector.<Sala>;
		private var servico:ControleServerSocket;
		private var telaInicio:AdminIniciarSWC;
		private var telaConexoes:AdminConexoesSWC;
		private var telaPrincial:WARAdminSWC;
		private var dataBasePath:String;
		
		public function Main():void {
			
			if (this.stage) {
				this.onInit();
			} else {
				this.addEventListener(Event.ADDED_TO_STAGE, onInit);
			}
		}
		
		private function onInit(e:Event = null):void {
			this.removeEventListener(Event.ADDED_TO_STAGE, onInit);
			// entry point
			
			this.qtdSalas = 0;
			this.salas = new Vector.<Sala> ();
			
			this.dataBasePath = File.applicationDirectory.nativePath + "\\data\\database.sqllite";
			
			//trace (this.runQuery ("SELECT nome, email, senha FROM usuarios", UsuarioVO).join ("\n"));
			//trace (this.runQuery ("SELECT * FROM saves").join ("\n"));
			
			this.telaPrincial = new WARAdminSWC ();
			this.addChild (this.telaPrincial);
			
			this.telaInicio = new AdminIniciarSWC ();
			this.telaInicio.porta.text = "6667";
			this.addChild (this.telaInicio);
			
			this.telaInicio.iniciar.addEventListener (MouseEvent.CLICK, onClickIniciar);
		
		}
		
		public function runQuery (sql:String, ResultClass:Class = null):Array {
			var dataBaseFile:File = File.applicationStorageDirectory.resolvePath (dataBasePath);
			
			var statement:SQLStatement = new SQLStatement ();
			var conn:SQLConnection = new SQLConnection ();
			conn.open (dataBaseFile);
			
			if (ResultClass != null) {
				statement.itemClass = ResultClass;
			}
			
			statement.addEventListener (SQLErrorEvent.ERROR, onError);
			statement.sqlConnection = conn;
			statement.text = sql;
			statement.execute ();
			
			var result:Array = statement.getResult().data;
			
			conn.close();
			
			return result;
		}
		
		private function onError(e:SQLErrorEvent):void {
			trace ("onError", e);
		}
		
		private function onCommit(e:SQLEvent):void {
			trace ("onCommit");
		}
		
		private function onBegin(e:SQLEvent):void {
			trace ("onBegin");
		}
		
		private function onResult(e:SQLEvent):void{
			trace ("onResult");
		}
		
		private function onClickIniciar(e:MouseEvent):void {
			
			this.servico = new ControleServerSocket (int (this.telaInicio.porta.text), TiposBroadcast.OBJECT);
			this.servico.addEventListener (ControleServerSocketEvent.CONECTADO, onConectado);
			this.servico.addEventListener (ControleServerSocketEvent.DESCONECTADO, onDesconectado);
			this.servico.addEventListener (ControleServerSocketEvent.ERRO, onErro);
			this.servico.addEventListener (ControleServerSocketEvent.ERRO_SEGURANCA, onErro);
			this.servico.addEventListener (ControleServerSocketEvent.ESCUTANDO, onEscutando);
			
			this.servico.iniciar ();
		}
		
		private function onEscutando(e:ControleServerSocketEvent):void {
			this.telaPrincial.status.gotoAndStop (2);
			TweenMax.to (this.telaInicio, 0.5, { y: this.telaInicio.y + 15, alpha: 0, onComplete: onCompleteInicio } );	
		}
		
		private function onConectado(e:ControleServerSocketEvent):void {
			trace ("onConectado", e.cliente);
			var cliente:Socket = e.cliente;
			cliente.addEventListener (ProgressEvent.SOCKET_DATA, onClienteData);
			
			/*
			var item:Object = {
				label: "Cliente " + (this.servico.numeroConexoes),
				data: cliente
			};*/
			
			//this.telaConexoes.usuarios.addItem (item);
		}
		
		private function onClienteData(e:ProgressEvent):void {
			var socket:Socket = e.target as Socket;
			socket.objectEncoding = ObjectEncoding.AMF3;
			
			var dado:Object = socket.readObject ();
						
			trace ( "onClienteData", dado.dataType);
			
			switch (dado.dataType) {
				case Mensagens.LOGIN: 
					var resultado:Array = this.runQuery ("SELECT usuarioid,nome,email,senha FROM usuarios WHERE email='" + dado.data.login +"' and senha='" + dado.data.senha + "'", UsuarioVO);
					if (resultado != null && resultado.length > 0) {
						var usuarioVO:UsuarioVO = resultado[0];
						socket.writeObject ( { dataType: Mensagens.LOGIN, data: usuarioVO } );
						socket.flush ();
					} else {
						socket.writeObject ( { dataType: Mensagens.USUARIO_NAO_EXISTE, data: {} } );
						socket.flush ();
					}
					break;
				
				case Mensagens.CADASTRAR:
					var sql:String = "INSERT INTO usuarios (nome,email,senha) VALUES ('" + dado.data.nome + "','" + dado.data.email + "','" + dado.data.senha + "')";
					this.runQuery (sql);
					
					socket.writeObject ( { dataType: Mensagens.CADASTRAR, data: {} } );
					socket.flush ();
					break;
				
				case Mensagens.CRIAR_JOGO:
					
					var moderadorVO:UsuarioVO = new UsuarioVO (dado.data.id, dado.data.nome, dado.data.email, dado.data.senha);
					var usuarios:Vector.<UsuarioVO> = new Vector.<UsuarioVO>();
					usuarios.push (moderadorVO);
					var sala:Sala = new Sala (this.qtdSalas, moderadorVO, usuarios, 1);
					this.salas.push (sala);
					
					this.qtdSalas++;
					
					socket.writeObject ( { dataType: Mensagens.CRIAR_JOGO, data: sala  } );
					socket.flush (); 
					break;
				
				case Mensagens.SELECIONAR_COR:
					trace (dado.data.idSala, dado.data.idCor, dado.data.nomeUsuario);
					/*var moderadorVO:UsuarioVO = new UsuarioVO (dado.data.usuario.id, dado.data.usuario.nome, dado.data.usuario.email, dado.data.usuario.senha);
					var usuarios:Vector.<UsuarioVO> = new Vector.<UsuarioVO>();
					usuarios.push (moderadorVO);
					var sala:Sala = new Sala (this.qtdSalas, moderadorVO, usuarios, 1);
					this.salas.push (sala);
					
					this.qtdSalas++;
					
					var idCor:int = dado.data.idCor;
					var nomeUsuario:int = dado.data.nomeUsuario;
					var idSala:int = dado.data.idSala;
					
					socket.writeObject ( { dataType: Mensagens.CRIAR_JOGO, data: { sala: sala } } );
					socket.flush ();*/
					break;
				
			}
			
			/*var usuarioVO:UsuarioVO = new UsuarioVO ();
			var obj:Object = cliente.readObject ();
			usuarioVO.email = obj.email;
			usuarioVO.senha = obj.senha;
			
			var resultado:Array = this.runQuery ("SELECT nome,email,senha FROM usuarios WHERE email='" + usuarioVO.email +"' and senha='" + usuarioVO.senha + "'", UsuarioVO);
			trace (resultado);*/
			
		}
		
		private function onCompleteInicio():void{
			this.telaConexoes = new AdminConexoesSWC ();
			this.telaConexoes.y = -15;
			this.telaConexoes.alpha = 0;
			TweenMax.to (this.telaConexoes, 0.5, { y: 0, alpha: 1, onComplete: onCompleteCon } );	
			this.addChild (this.telaConexoes);
		}
		
		private function onCompleteCon():void {
			
		}
		
		private function onErro(e:ControleServerSocketEvent):void {
			trace ("#onErro");
		}
		
		private function onDesconectado(e:ControleServerSocketEvent):void {
			trace ("onDesconectado", e.cliente);
			for (var i:int = 0; i < this.telaConexoes.usuarios.length; i++) {
				if (e.clienteId == i) {
					this.telaConexoes.usuarios.removeItemAt (i);
				}
			}
		}
	}
}